home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / master / Examples / Visual / VCommon / renderinfo.c < prev    next >
C/C++ Source or Header  |  1994-08-18  |  4KB  |  167 lines

  1. /*
  2.  * MKSoft Development Amiga ToolKit V1.0
  3.  *
  4.  * Copyright (c) 1985,86,87,88,89,90 by MKSoft Development
  5.  *
  6.  */
  7.  
  8. /*
  9.  * This file contains the definition of the rendering information
  10.  * for elements on the screen.  This information is used to generate
  11.  * the correct pen colours for items on the screen...
  12.  */
  13.  
  14. #include   <exec/types.h>
  15. #include   <exec/memory.h>
  16. #include   <graphics/view.h>
  17. #include   <graphics/text.h>
  18. #include   <intuition/intuition.h>
  19. #include   <intuition/screens.h>
  20.  
  21. #include   <proto/exec.h>
  22. #include   <proto/intuition.h>
  23. #include   <proto/graphics.h>
  24.  
  25. #include   "RenderInfo.h"
  26. #include   "DefaultFonts.h"
  27.  
  28. /*
  29.  * These define the amount of Red, Green, and Blue scaling used
  30.  * to help take into account the different visual impact of those
  31.  * colours on the screen.
  32.  */
  33. #define BLUE_SCALE      2
  34. #define GREEN_SCALE     6
  35. #define RED_SCALE       3
  36.  
  37. /*
  38.  * This returns the colour difference hamming value...
  39.  */
  40. SHORT ColourDifference(UWORD rgb0, UWORD rgb1)
  41. {
  42.    register   SHORT   level;
  43.    register   SHORT   tmp;
  44.  
  45.    tmp=(rgb0 & 15) - (rgb1 & 15);
  46.    level=tmp*tmp*BLUE_SCALE;
  47.    tmp=((rgb0>>4) & 15) - ((rgb1>>4) & 15);
  48.    level+=tmp*tmp*GREEN_SCALE;
  49.    tmp=((rgb0>>8) & 15) - ((rgb1>>8) & 15);
  50.    level+=tmp*tmp*RED_SCALE;
  51.    return(level);
  52. }
  53. #define MAX_COLOURS     16
  54.  
  55. /*
  56.  * For new programs, this also opens fonts...
  57.  */
  58. void FillIn_RenderInfo(struct RenderInfo *ri, struct Screen *TheScreen)
  59. {
  60. register   SHORT      numcolours;
  61. register   SHORT      loop;
  62. register   SHORT      loop1;
  63. register   SHORT      backpen;
  64. register   SHORT      tmp;
  65.            SHORT      colours[16];
  66.            SHORT      colourlevels[16];
  67.            SHORT      pens[16];
  68.    struct  Screen     screen;
  69.  
  70.    if (!TheScreen) GetScreenData((APTR)(TheScreen=&screen),
  71.                                  sizeof(struct Screen),WBENCHSCREEN,NULL);
  72.  
  73.    ri->WindowTop    = TheScreen->WBorTop;
  74.    ri->WindowLeft   = TheScreen->WBorLeft;
  75.    ri->WindowRight  = TheScreen->WBorRight;
  76.    ri->WindowBottom = TheScreen->WBorBottom;
  77.    ri->WindowTitle  = TheScreen->BarHeight-TheScreen->BarVBorder+TheScreen->WBorTop;
  78.  
  79.    ri->ScreenWidth  = TheScreen->Width;
  80.    ri->ScreenHeight = TheScreen->Height;
  81.  
  82.    ri->FontSize     = TheScreen->Font->ta_YSize;
  83.  
  84.    if (!(ri->TheFont=OpenFont(TheScreen->Font)))
  85.       ri->TheFont = OpenFont(&TOPAZ80);
  86.  
  87.    if (ri->TheFont)
  88.    {
  89.       ri->TextAttr.ta_Name=ri->TheFont->tf_Message.mn_Node.ln_Name;
  90.       ri->TextAttr.ta_YSize=ri->TheFont->tf_YSize;
  91.       ri->TextAttr.ta_Style=ri->TheFont->tf_Style;
  92.       ri->TextAttr.ta_Flags=ri->TheFont->tf_Flags;
  93.    }
  94.    else ri->TextAttr=TOPAZ80;
  95.  
  96.    numcolours=1 << (TheScreen->RastPort.BitMap->Depth);
  97.    if (numcolours>16) numcolours=16;
  98.  
  99.    if (numcolours<3)
  100.    {       /* Some silly person is running with 2 colours... */
  101.       ri->BackPen=0;
  102.       ri->Highlight=1;
  103.       ri->Shadow=1;
  104.       ri->TextPen=1;
  105.    }
  106.    else
  107.    {
  108.       for (loop=0;loop<numcolours;loop++)
  109.       {
  110.          colours[loop]=GetRGB4(TheScreen->ViewPort.ColorMap,(LONG)loop);
  111.          colourlevels[loop]=ColorLevel(colours[loop]);
  112.          pens[loop]=loop;
  113.       }
  114.  
  115.       /* Sort darkest to brightest... */
  116.       for (loop=0;loop<(numcolours-1);loop++)
  117.          for (loop1=loop+1;loop1<numcolours;loop1++)
  118.          {
  119.             if (colourlevels[loop]>colourlevels[loop1])
  120.             {
  121.                tmp=colourlevels[loop];
  122.                colourlevels[loop]=colourlevels[loop1];
  123.                colourlevels[loop1]=tmp;
  124.  
  125.                tmp=colours[loop];
  126.                colours[loop]=colours[loop1];
  127.                colours[loop1]=tmp;
  128.  
  129.                tmp=pens[loop];
  130.                pens[loop]=pens[loop1];
  131.                pens[loop1]=tmp;
  132.             }
  133.           }
  134.  
  135.       /* Now, pick the pens... HightLight... */
  136.       loop=numcolours-1;
  137.       while (!(ri->Highlight=pens[loop--]));
  138.  
  139.       /* and Shadow... */
  140.       loop=0;
  141.       while (!(ri->Shadow=pens[loop++]));
  142.  
  143.       /* The BackGround pen... */
  144.       if (!pens[loop]) loop++;
  145.       ri->BackPen=pens[backpen=loop];
  146.  
  147.       loop1=0;
  148.       for (loop=0;loop<numcolours;loop++)
  149.       {
  150.          tmp=ColourDifference(colours[loop],colours[backpen]);
  151.          if (tmp > loop1)
  152.          {
  153.             loop1 = tmp;
  154.             ri->TextPen = pens[loop];
  155.          }
  156.       }
  157.    }
  158. }
  159.  
  160. /*
  161.  * Close the font and free the memory...
  162.  */
  163. VOID CleanUp_RenderInfo(struct RenderInfo *ri)
  164. {
  165.    if (ri && ri->TheFont) CloseFont(ri->TheFont);
  166. }
  167.